﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Open_MUD.Kernel.Interface.Client;
using OpenMUD;
using OpenMUD.Mudlib.lib.Loc;
using Open_MUD.Mudlib.lib.Interactive;
using Open_MUD.Kernel.Utils;
using System.Collections;

namespace Open_MUD.Mudlib.lib.Interactive
{
    /**
     *
     * Que puede moverse, ejecutar acciones, etc
     * 
     */
	class Interactivo:Contenedor
	{
	    protected string nombre;
        protected string nivel;
        protected string raza;
        protected string subraza;
        protected string edad;
        protected string ciudadania;
        protected string localizacion;
        protected string clase;
        
        protected string altura;
        protected string ojos;
        protected string pelo;
        protected string complexion;
        
        private bool escondido = false;
        
	    private Cliente cliente = null;
	    protected Caracteristicas caracteristicas;

        protected ArrayList Inventario
        {
            get { return contenido; }
        }

	    const int CANSADO = -1;
		const int AGOTADO = -300;
		/* Puntos de fatiga */
		private int pf;
		protected int PF
		{
			get{return pf;}
			set{ 
				if ( value > 0 ) pf = value;
				else{
					value = CANSADO;
					event_cansado();
				}
			}
		}

        public Cliente Cliente
        {
            get { return cliente; }
            set
            {                
                    cliente = value;
            }
        }
		
		public bool Escondido{
		   get{return escondido;}
		   set{escondido = value;}
		}


        protected virtual void event_abort_move() {
            if (pf == 0)
                cliente.render("No tienes suficientes puntos de fatiga");
            else
                cliente.render("No puedes moverte");
        }
        protected virtual bool test_move(Room donde) { return true; }
        
        public void notificar(String msg)
        {
           if ( cliente != null )
              cliente.render(msg);
        }
	    public void force_move(Room donde)
	    {
            this.Entorno = donde;	       
	    }
	    
		public void move(Room donde,Salida s)
		{	   
			if ( test_move(donde) )
			{ //moverse
			   if ( PruebaFatigaNormal() )
		       {
                    if ( this.Entorno is Room )
                        ((Room) this.Entorno).event_moving(this, s.DameNombreSalida());
                    event_move(donde);
				    this.Entorno = donde;				
				    donde.event_moved(this, s.DameNombreSalidaInv());
		       }
			}else
			{// no moverse
				event_abort_move();
			}		   
		}
		
		protected bool PruebaFatigaNormal()
		{
		   if ( pf > 1)
		   {
		      pf -=2;
		      return true;
		   }
		   return false;
		} 
		protected bool PruebaFatigaFacil()
		{
		   if (pf > 0)
		   {
		      pf--;
		      return true;
		   }
		   return false;
		}  
		protected bool PruebaFatigaMuyFacil()
		{		   
		   if ( pf > 0)
		   {
		      if ( DateTime.Now.Millisecond % 2 == 0 )
		         pf--;
		      return true;
		   }
		   return false;
		}		
		protected bool PruebaFatigaSevera()
		{
            if (pf > 2)
            {
                pf -= 3;
                return true;
            }
            return false;
		}
		protected bool PruebaFatigaMuySevera()
		{
            if (pf > 9)
            {
                pf -= 10;
                return true;
            }
            return false;
		}     
        
		
		public virtual void event_cansado()
		{
            //base.event_cansado();
			if ( cliente != null )
				cliente.render("Te encuentras demasiado cansado para ejecutar esa acción");
		}
		
		protected virtual bool event_move(Room donde)
		{
            //base.event_move();
			PF = PF - 1;
            return true;
		}
		
		public String ficha()
        {
           return 
           @"Nombre  : " + nombre + "%^ret%^" +
            "Nivel   : " + nivel + "%^ret%^" +
            "Clase   : " + clase + "%^ret%^" +
            "Casa    : " + raza + "%^ret%^" +
            "Familia : " + subraza + "%^ret%^" +
            "Edad    : " + edad + "%^ret%^" +
            "Ciudad  : " + ciudadania + "%^ret%^" +
            "Altura  : " + altura + "%^ret%^" +
            "Ojos    : " + ojos + "%^ret%^" +
            "Pelo    : " + pelo + "%^ret%^" +
            "Compl.  : " + complexion + "%^ret%^" +
            "===============================================" + "%^ret%^" +  
            "Fue : " + caracteristicas.Fuerza + " (" + Util.getInstance().FormatColorNumber(caracteristicas.Fue) + "%^reset%^) " + "%^ret%^" +
            "Con : " + caracteristicas.Constitucion + " (" + Util.getInstance().FormatColorNumber(caracteristicas.Con) + "%^reset%^) " + "%^ret%^" +
            "Des : " + caracteristicas.Destreza + " (" + Util.getInstance().FormatColorNumber(caracteristicas.Des) + "%^reset%^) " + "%^ret%^" +
            "Int : " + caracteristicas.Inteligencia + " (" + Util.getInstance().FormatColorNumber(caracteristicas.Int) + "%^reset%^) " + "%^ret%^" +
            "Sab : " + caracteristicas.Sabiduria + " (" + Util.getInstance().FormatColorNumber(caracteristicas.Sab) + "%^reset%^) " + "%^ret%^" +
            "Car : " + caracteristicas.Carisma + " (" + Util.getInstance().FormatColorNumber(caracteristicas.Car) + "%^reset%^) " + "%^ret%^" +
            "Fortaleza : " + caracteristicas.Fortaleza + "%^ret%^" +
            "Reflejos  : " + caracteristicas.Reflejos +  "%^ret%^" +
            "Voluntad  : " + caracteristicas.Voluntad;                
        }
		
		public virtual string toXML(string inner)
		{
		   string xml =
		   "<interactivo>"+
		   "<nombre>"+nombre+"</nombre>"+
		   "<nivel>"+nivel+"</nivel>"+
		   "<raza>"+raza+"</raza>"+
		   "<subraza>"+subraza+"</subraza>"+
		   "<edad>"+edad+"</edad>"+
		   "<ciudadania>"+ciudadania+"</ciudadania>"+
		   "<localizacion>"+localizacion+"</localizacion>"+
		   "<clase>"+clase+"</clase>"+
		   "<altura>"+altura+"</altura>"+
		   "<ojos>"+ojos+"</ojos>"+
		   "<pelo>"+pelo+"</pelo>"+
		   "<complexion>"+complexion+"</complexion>"+		  
		   inner+
		   "</interactivo>";
		   return base.toXML(xml);
		}
		public virtual string getPath()
        {
           return base.getPath() + "/interactivo";
        }
        
        public virtual void fromXML()
        {
           
        }
    }
}
